import '@/style/index.scss'
import { VueQueryPlugin } from '@tanstack/vue-query'
import 'virtual:uno.css'
import { createSSRApp } from 'vue'

import App from './App.vue'
import { prototypeInterceptor, requestInterceptor, routeInterceptor } from './interceptors'
import store from './store'
import { dbService } from './services/database'


// 全局标记数据库是否已初始化
let dbInitialized = false
// 最大重试次数
const MAX_DB_INIT_RETRIES = 3
// 当前重试次数
let dbInitRetryCount = 0

/**
 * 初始化数据库
 * @param retryCount 当前重试次数
 */
async function initDatabase(retryCount = 0) {
  try {
    console.log(`应用初始化 - 开始数据库初始化 (尝试${retryCount + 1}/${MAX_DB_INIT_RETRIES})`)
    
    const success = await dbService.init()
    
    if (success) {
      console.log('应用初始化 - 数据库初始化成功')
      
      // 再次验证是否真的可以执行查询
      const testQuery = await dbService.isInitialized()
      if (!testQuery) {
        throw new Error('数据库初始化后验证失败')
      }
    } else {
      throw new Error('数据库初始化失败')
    }
  } catch (error) {
    console.error('应用初始化 - 数据库初始化出错:', error)
    
    // 如果还有重试次数，延迟后重试
    if (retryCount < MAX_DB_INIT_RETRIES - 1) {
      console.log(`应用初始化 - 将在1秒后进行第${retryCount + 2}次尝试`)
      setTimeout(() => {
        initDatabase(retryCount + 1)
      }, 1000)
    } else {
      console.error('应用初始化 - 数据库初始化失败，已达到最大重试次数')
    }
  }
}

export function createApp() {
  const app = createSSRApp(App)
  app.use(store)
  app.use(routeInterceptor)
  app.use(requestInterceptor)
  app.use(prototypeInterceptor)
  app.use(VueQueryPlugin)

  // 在应用创建时初始化数据库，只执行一次
  if (!dbInitialized) {
    dbInitialized = true
    
    // 使用较短的延迟确保应用已完全挂载
    setTimeout(() => {
      initDatabase(0)
    }, 500) // 延迟0.5秒以确保应用完全初始化
  }

  return {
    app,
  }
}
